package 剑指Offer.简单;

import java.util.ArrayList;
import java.util.List;

/**
 * 输入一个正整数 target ，输出所有和为 target 的连续正整数序列（至少含有两个数）。
 * <p>
 * 序列内的数字由小到大排列，不同序列按照首个数字从小到大排列。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：target = 9
 * 输出：[[2,3,4],[4,5]]
 * 示例 2：
 * <p>
 * 输入：target = 15
 * 输出：[[1,2,3,4,5],[4,5,6],[7,8]]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author caihe
 * @date 2022/8/29 15:48
 */
public class _57II和为s的连续正数序列 {

    public static void main(String[] args) {
        _57II和为s的连续正数序列 a = new _57II和为s的连续正数序列();
        int[][] continuousSequence = a.findContinuousSequence(9);
        System.out.println();
    }
    
    /**
     * 使用滑动窗口方式
     */
    public int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<>();
        int left = 1, right = 2;
        int sum = 3;
        while (right < target) {
            if (sum == target) {
                int[] nums = new int[right - left + 1];
                for (int i = left; i <= right; i++) {
                    nums[i- left] = i;
                }
                res.add(nums);
            }
            if (sum >= target) {
                sum -= left;
                left++;

            } else {
                right++;
                sum += right;
            }
        }
        return res.toArray(new int[0][]);
    }

}
